package com.executor;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.*;

/**
 * @author: csh
 * @Date: 2023/3/7 23:08
 * @Description:
 */
public interface ExecutorServiceStudy {

    /**
     * shutdown方法用于关闭线程池，不会立即停止所有任务的执行，而是等待所有任务执行完毕后再关闭。
     */
    void shutdown();

    /**
     * shutdownNow方法用于关闭线程池，并尝试停止所有正在执行的任务。
     */
    List<Runnable> shutdownNow();

    /**
     * isShutdown方法用于判断线程池是否已经关闭。
     */
    boolean isShutdown();

    /**
     * isTerminated方法用于判断线程池是否已经关闭，并且所有任务都已经执行完毕。
     */
    boolean isTerminated();

    /**
     * awaitTermination方法用于等待线程池关闭，并且所有任务都已经执行完毕。
     */
    boolean awaitTermination(long timeout, TimeUnit unit)
            throws InterruptedException;

    /**
     * submit方法用于提交一个Callable或Runnable任务到线程池，并返回一个Future对象，可以通过Future对象获取任务的执行结果或取消任务的执行。
     */
    <T> Future<T> submit(Callable<T> task);

    /**
     * Submits提交一个可运行任务以供执行，并返回表示该任务的Future。Future的get方法将在成功完成时返回给定的结果。
     */
    <T> Future<T> submit(Runnable task, T result);

    /**
     * 提交一个可运行任务以供执行，并返回表示该任务的Future。Future的get方法将在成功完成时返回null。
     */
    Future<?> submit(Runnable task);

    /**
     * 执行给定的任务，在所有任务完成时返回包含它们的状态和结果的Futures列表。的未来。对于返回列表的每个元素，isDone都是true。
     */
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
            throws InterruptedException;

    /**
     * 带超时时间 同上类似
     */
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
                                  long timeout, TimeUnit unit)
            throws InterruptedException;

    /**
     * 执行给定的任务，如果有成功完成的任务，则返回成功完成的任务的结果(即，没有抛出异常)。在正常或异常返回时，未完成的任务将被取消。如果在执行此操作时修改了给定的集合，则此方法的结果是未定义的。
     */
    <T> T invokeAny(Collection<? extends Callable<T>> tasks)
            throws InterruptedException, ExecutionException;

    /**
     *  同上类似 带超时时间
     */
    <T> T invokeAny(Collection<? extends Callable<T>> tasks,
                    long timeout, TimeUnit unit)
            throws InterruptedException, ExecutionException, TimeoutException;
}
